package com.ys.extend.utils;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.Map;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.PropertyUtilsBean;

/**
 * 对象拷贝 
 * @author wdj
 *
 */
public class YSBeanUtil extends PropertyUtilsBean{
	 /**
	 * 对象拷贝
	 * 数据对象空值不拷贝到目标对象
	 * 把所有目标对象都去掉两边空格
	 * 
	 * @param dataObject
	 * @param toObject
	 * @throws NoSuchMethodException
	 * copy
	 */
	 public static void copyBeanNotNull2BeanExactly(Object databean,Object tobean)throws Exception
	 {
		  PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(databean);
	     for (int i = 0; i < origDescriptors.length; i++) {
	         String name = origDescriptors[i].getName();
	//         String type = origDescriptors[i].getPropertyType().toString();
	         if ("class".equals(name)) {
	             continue; // No point in trying to set an object's class
	         }
	         if (PropertyUtils.isReadable(databean, name) &&PropertyUtils.isWriteable(tobean, name)) {
	             try {
	                 Object value = PropertyUtils.getSimpleProperty(databean, name);
	                 
	                 if(value instanceof String){
	               	  value = ((String) value).trim();
	                 }
	                 if(value!=null){
	               	  getInstance().setSimpleProperty(tobean, name, value);
	                 }
	             }
	             catch (java.lang.IllegalArgumentException ie) {
	                 ; // Should not happen
	             }
	             catch (Exception e) {
	                 ; // Should not happen
	             }
	         }
	     }
	 }

	 /**
	  * 将Map内的key与Bean中属性相同的内容复制到BEAN中
	  * @param bean Object
	  * @param properties Map
	  * @throws IllegalAccessException
	  * @throws InvocationTargetException
	  */
	 public static void copyMap2Bean(Map properties, Object bean) throws
	     IllegalAccessException, InvocationTargetException {
	     // Do nothing unless both arguments have been specified
	     if ( (bean == null) || (properties == null)) {
	         return;
	     }
	     // Loop through the property name/value pairs to be set
	     Iterator names = properties.keySet().iterator();
	     while (names.hasNext()) {
	         String name = (String) names.next();
	         // Identify the property name and value(s) to be assigned
	         if (name == null) {
	             continue;
	         }
	         Object value = properties.get(name);
	         try {
	             Class clazz = PropertyUtils.getPropertyType(bean, name);
	             if (null == clazz) {
	                 continue;
	             }
	             String className = clazz.getName();
	             if (className.equalsIgnoreCase("java.sql.Timestamp")) {
	                 if (value == null || value.equals("")) {
	                     continue;
	                 }
	             }
	             getInstance().setSimpleProperty(bean, name, value);
	         }
	         catch (NoSuchMethodException e) {
	             continue;
	         }
	     }
	 }
 
	  /**
	   * 自动转Map key值大写
	   * 将Map内的key与Bean中属性相同的内容复制到BEAN中
	   * @param bean Object
	   * @param properties Map
	   * @throws IllegalAccessException
	   * @throws InvocationTargetException
	   */
	  public static void copyMap2Bean_Nobig(Map properties, Object bean) throws
	      IllegalAccessException, InvocationTargetException {
	      // Do nothing unless both arguments have been specified
	      if ( (bean == null) || (properties == null)) {
	          return;
	      }
	      // Loop through the property name/value pairs to be set
	      Iterator names = properties.keySet().iterator();
	      while (names.hasNext()) {
	          String name = (String) names.next();
	          // Identify the property name and value(s) to be assigned
	          if (name == null) {
	              continue;
	          }
	          Object value = properties.get(name);
	          // 命名应该大小写应该敏感(否则取不到对象的属性)
	          //name = name.toLowerCase();
	          try {
	        	  if (value == null) {	// 不光Date类型，好多类型在null时会出错
	                  continue;	// 如果为null不用设 (对象如果有特殊初始值也可以保留？)
	              }
	              Class clazz = PropertyUtils.getPropertyType(bean, name);
	              if (null == clazz) {	// 在bean中这个属性不存在
	                  continue;
	              }
	              String className = clazz.getName();
	              // 临时对策（如果不处理默认的类型转换时会出错）
	              if (className.equalsIgnoreCase("java.util.Date")) {
	                  value = new java.util.Date(((java.sql.Timestamp)value).getTime());// wait to do：貌似有时区问题, 待进一步确认
	              }
//	              if (className.equalsIgnoreCase("java.sql.Timestamp")) {
//	                  if (value == null || value.equals("")) {
//	                      continue;
//	                  }
//	              }
	              getInstance().setSimpleProperty(bean, name, value);
	          }
	          catch (NoSuchMethodException e) {
	              continue;
	          }
	      }
	  }	 

	  /**
	   * Map内的key与Bean中属性相同的内容复制到BEAN中
	   * 对于存在空值的取默认值
	   * @param bean Object
	   * @param properties Map
	   * @param defaultValue String
	   * @throws IllegalAccessException
	   * @throws InvocationTargetException
	   */
	  public static void copyMap2Bean(Object bean, Map properties, String defaultValue) throws
	      IllegalAccessException, InvocationTargetException {
	      // Do nothing unless both arguments have been specified
	      if ( (bean == null) || (properties == null)) {
	          return;
	      }
	      // Loop through the property name/value pairs to be set
	      Iterator names = properties.keySet().iterator();
	      while (names.hasNext()) {
	          String name = (String) names.next();
	          // Identify the property name and value(s) to be assigned
	          if (name == null) {
	              continue;
	          }
	          Object value = properties.get(name);
	          try {
	              Class clazz = PropertyUtils.getPropertyType(bean, name);
	              if (null == clazz) {
	                  continue;
	              }
	              String className = clazz.getName();
	              if (className.equalsIgnoreCase("java.sql.Timestamp")) {
	                  if (value == null || value.equals("")) {
	                      continue;
	                  }
	              }
	              if (className.equalsIgnoreCase("java.lang.String")) {
	                  if (value == null) {
	                      value = defaultValue;
	                  }
	              }
	              getInstance().setSimpleProperty(bean, name, value);
	          }
	          catch (NoSuchMethodException e) {
	              continue;
	          }
	      }
	  }
 
}
